from concurrent import futures
##1、主线程中可以获取某一个线程的状态或者某一任务的状态以及返回值
##2、当一个线程完成的时候主线程能立即知道
##3、futures可以让多线程和多进程编码接口一致
import time

def get_html(times):
    time.sleep(times)
    print("get page {} success".format(times))
    return times

executor=futures.ThreadPoolExecutor(max_workers=2)
##submit将任务函数放到线程池中，会立即执行非阻塞
task1=executor.submit(get_html,(3))
task2=executor.submit(get_html,(2))
print(task1.done())##立即执行done()是False
print(task2.done())##立即执行done()是False
print(task1.result())##result是阻塞的获取线程结果3
print(task2.result())##2
print(task1.done())##由于result阻塞导致任务完成了 True
print(task2.done())##任务完成了True

print("////////////////////////////")
##要获取已完成的task的返回
times_list=[3,4,1,2,3,1]
tasks=[ executor.submit(get_html,(a)) for a in times_list]
for future in futures.as_completed(tasks):
    result=future.result()
    print("%ss task done"%result)


print("////////////////////////////")
for result in executor.map(get_html,times_list):##此两句相当于上面四行代码
    print("%s s task done"%result)